from typing import Dict, List, Optional
from sqlalchemy import and_
from ..models.user_role import UserRole
from ..models.user import User
from ..models.role import Role
from ..extensions.extensions import db
from datetime import datetime, timezone

class UserRoleService:
    @staticmethod
    def get_user_role_list(page: int = 1, per_page: int = 10, user_id: Optional[int] = None) -> Dict:
        """
        获取用户角色关系列表
        :param page: 页码
        :param per_page: 每页数量
        :param user_id: 用户ID过滤
        :return: 用户角色关系列表和分页信息
        """
        query = UserRole.query.filter_by(deleted=False)
        
        # 按用户ID过滤
        if user_id:
            query = query.filter(UserRole.user_id == user_id)
        
        # 分页
        pagination = query.order_by(UserRole.created_at.desc()).paginate(
            page=page, per_page=per_page, error_out=False
        )
        
        # 获取关联数据
        items = []
        for item in pagination.items:
            user = User.query.get(item.user_id)
            role = Role.query.get(item.role_id)
            if user and role:
                data = item.to_dict()
                data.update({
                    'username': user.username,
                    'role_name': role.role_name,
                    'role_code': role.role_code
                })
                items.append(data)
        
        return {
            'total': pagination.total,
            'page': page,
            'per_page': per_page,
            'items': items
        }

    @staticmethod
    def get_user_role_by_id(id: int) -> Optional[UserRole]:
        """
        根据ID获取用户角色关系
        :param id: 关系ID
        :return: 用户角色关系对象
        """
        return UserRole.query.filter_by(id=id, deleted=False).first()

    @staticmethod
    def check_user_role_exists(user_id: int, role_id: int) -> bool:
        """
        检查用户角色关系是否存在
        :param user_id: 用户ID
        :param role_id: 角色ID
        :return: 是否存在
        """
        return UserRole.query.filter(
            and_(
                UserRole.user_id == user_id,
                UserRole.role_id == role_id,
                UserRole.deleted == False
            )
        ).first() is not None

    @staticmethod
    def create_user_role(user_id: int, role_id: int) -> UserRole:
        """
        创建用户角色关系
        :param user_id: 用户ID
        :param role_id: 角色ID
        :return: 用户角色关系对象
        """
        user_role = UserRole(
            user_id=user_id,
            role_id=role_id
        )
        db.session.add(user_role)
        db.session.commit()
        return user_role

    @staticmethod
    def delete_user_role(user_role: UserRole) -> bool:
        """
        删除用户角色关系（软删除）
        :param user_role: 用户角色关系对象
        :return: 是否成功
        """
        user_role.deleted = True
        user_role.updated_at = datetime.now(timezone.utc)
        db.session.commit()
        return True

    @staticmethod
    def batch_create_user_roles(user_id: int, role_ids: List[int]) -> bool:
        """
        批量创建用户角色关系
        :param user_id: 用户ID
        :param role_ids: 角色ID列表
        :return: 是否成功
        """
        try:
            # 先删除用户现有角色
            UserRole.query.filter_by(user_id=user_id, deleted=False).update(
                {"deleted": True, "updated_at": datetime.now(timezone.utc)}
            )
            
            # 创建新的角色关系
            for role_id in role_ids:
                user_role = UserRole(user_id=user_id, role_id=role_id)
                db.session.add(user_role)
            
            db.session.commit()
            return True
        except Exception:
            db.session.rollback()
            raise 